Tricktresorsche Glockenkurve

Eine kleine Fingerübung im old-style, die aus einem Denkansatz heraus abgefallen ist: Eine kleine “grafische” Spielerei zur Darstellung der Gauß-Funktion/ Glockenkurve/ Normalverteilung.

Da dies für mich bereits höhere Mathematik ist, bin ich besonders stolz auf diese kleine Spielerei. Eine schönere Möglichkeit wäre sicherlich die Darstellung im GFW-Framework, aber ich wollte nur schnell sehen, ob die berechneten Werte irgendwie stimmig sind.

GFW-Framework

Bei Interesse schau dir die Demoprogramme GFW_PROG* und GFW_DEMO* einmal an:

GFW_DEMO_HIER3 GFW: Demonstration einer Hierarchie-/Präsentationsgrafik (Drag&Drop)
GFW_DEMO_PRES GFW: Demonstration von GFW mit sichtbarem Datencontainer
GFW_DEMO_PRES1 GFW: Demonstration von Präsentationsgrafiken mit GFW
GFW_DEMO_PRES_MAIN  class with application logic of example report “GFW_DEMO_PRES”

GFW_PROG_BAR GFW: Programmierbeispiel für ein Balkendiagramm
GFW_PROG_COLUMNS_AND_TIME_AXIS GFW: Programmierbeispiel für ein Balkendiagramm mit Zeitachse
GFW_PROG_CREATE_CUSTOMIZING GFW: Programmierbeisp. für einfachen Gebrauch von Customizing-Bündeln
GFW_PROG_DC_PERFORMANCE GFW: Programmierbeispiel für die schnelle Datencontainerverwendung
GFW_PROG_GET_CU_BUNDLE GFW: Programmierbeispiel mit Methode if_graphic_proxy~get_cu_bundle
GFW_PROG_HISTOGRAM GFW: Programmierbeispiel für ein Histogramm
GFW_PROG_LABELS GFW: Programmierbeispiel für dieselben Beschriftungen, lange Beschr.
GFW_PROG_MTA GFW: Programmierbeispiel für eine Meilensteintrendanalyse
GFW_PROG_PIE GFW: Programmierbeispiel für ein Kreisdiagramm
GFW_PROG_POINT_WITH_LABEL GFW: Programmierbeispiel für Diagramm mit gekennzeichnetem Punkt
GFW_PROG_PORTFOLIO GFW: Programmierbeispiel für ein Balkendiagramm
GFW_PROG_SPEEDOMETER GFW: Programmierbeispiel für ein Balkendiagramm
GFW_PROG_TIME_AXIS GFW: Programmierbeispiel für ein Punktdiagramm mit Zeitachse
GFW_PROG_TUTORIAL GFW: Programmierbeispiel für eine einfache PräsGrafik = GFW-Tutorial

Code

REPORT zz_gauss_timer_demo NO STANDARD PAGE HEADING LINE-SIZE 1000.


CLASS main DEFINITION.
  PUBLIC SECTION.
    METHODS start.
  PROTECTED SECTION.
    DATA sigma TYPE f VALUE '0.1'.
    DATA my TYPE f VALUE 0.
    DATA count TYPE i.
    METHODS gauss.
    DATA timer TYPE REF TO cl_gui_timer.
    METHODS finished FOR EVENT finished OF cl_gui_timer.
    METHODS clear_screen.
ENDCLASS.

CLASS main IMPLEMENTATION.
  METHOD start.
    gauss( ).
    timer = NEW #( ).
    SET HANDLER finished FOR timer.
    timer->interval = 1.
    timer->run( ).
  ENDMETHOD.

  METHOD finished.
    gauss( ).
    ADD 1 TO count.
    IF count < 10.
      timer->run( ).
    ELSE.
      SKIP TO LINE 28.
      POSITION 120.
      WRITE 'FINISHED'.
    ENDIF.
  ENDMETHOD.

  METHOD gauss.

    DATA e   TYPE f VALUE '2.718281828459'.
    DATA pi  TYPE f VALUE '3.14159265359'.
    DATA x   TYPE f.
    DATA erg TYPE f.
    DATA anz TYPE i VALUE 51.
    DATA l   TYPE i. "value for result (scaled)

    clear_screen( ).

    SKIP TO LINE 3.

    ADD '0.02' TO sigma.

    x = -1.


    DO anz TIMES.

      "calculate gauss
      erg = ( 1 / sigma * sqrt( 2 * pi ) ) * e **
            ( '0.5-' * (  ( x - my ) / (  sigma  ) ) ** 2 ) .

      "write result
      WRITE: / x EXPONENT 0 DECIMALS 2, erg EXPONENT 0 DECIMALS 5.

      "scale result
      l = erg * 4.

      "write graph
      DO l TIMES.
        WRITE sym_checkbox as SYMBOL NO-GAP.
*        WRITE icon_bw_apd_source as icon NO-GAP.
      ENDDO.

      "add step
      x = x + 1 / ( ( anz - 1 ) / 2 ) .

    ENDDO.
  ENDMETHOD.

  METHOD clear_screen.
    SKIP TO LINE 1.

    write: /20 'x-value                 result;   sigma=', sigma EXPONENT 0 DECIMALS 3 LEFT-JUSTIFIED,
               'my=', my EXPONENT 0 DECIMALS 3 LEFT-JUSTIFIED.

    SET BLANK LINES ON.
    DO 50 TIMES.
      DO sy-linsz TIMES.
        WRITE space NO-GAP.
      ENDDO.
    ENDDO.
  ENDMETHOD.

ENDCLASS.


START-OF-SELECTION.
  NEW main( )->start( ).

 

Enno Wulff